#include<bits/stdc++.h>
using namespace std;
struct node{
    int l,r;
}ca[100005],caa[100005];
int b[100005];
bool cmp(node x,node y){
    if(x.l!=y.l) return x.l<y.l;
    return x.r<y.r;
}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T,n,m,L,V,d,v,a,k,t,kk,ans;
    bool f,ff;
    cin>>T;
    while(T--){
        cin>>n>>m>>L>>V;
        k=0;
        ans=0;
        for(int i=1;i<=n;i++){
            cin>>d>>v>>a;
            if(a==0){
                if(v>V) ca[++k].l=d,ca[k].r=m,ans++;
            }
            else if(v>V&&a>=0) ca[++k].l=d,ca[k].r=m,ans++;
            else if(v>V&&a<=0){
                t=(v-V)/(-a);
                if(-t*a==(V-v)) t--;
                ca[++k].l=d;
                ca[k].r=d+v*t+0.5*a*t*t;
                ans++;
            }
            else if(v<=V&&a>=0){
                t=(V-v)/a;
                if(t*a==(V-v)) t--;
                ca[++k].l=d+v*t+0.5*a*t*t;
                ca[k].r=m;
                ans++;
            }
//            cout<<i<<' '<<ans<<'\n';
        }
        for(int i=1;i<=m;i++) cin>>b[i];
        for(int i=1;i<=k;i++){
            ff=0;
            for(int j=1;j<=m;j++){
                if(b[j]>=ca[i].l&&b[j]<=ca[i].r) ff=1;
            }
            if(ff==0) ans--;
        }
        sort(ca+1,ca+k+1,cmp);
        kk=0;
        for(int i=1;i<=k;i++){
            f=0;
            for(int j=1;j<=kk;j++){
                if(ca[i].l<=caa[j].r){
                    f=1;
                    caa[j].l=ca[i].l;
                    caa[j].r=min(ca[i].r,caa[j].r);
                    break;
                }
            }
            if(f==0) caa[++kk].l=ca[i].l,caa[kk].r=ca[i].r;
        }
        cout<<ans<<' '<<kk<<'\n';
    }
    return 0;
}
//detect
